#include <stdio.h>

// 定义权限结构体，使用位域节省内存
struct Permissions
{
  unsigned char read : 1;    // 只读1位，值只能是0或1
  unsigned char write : 1;   // 只占1位
  unsigned char execute : 1; // 只占1位
};

int main()
{
  int per;
  struct Permissions perms;

  printf("Enter the permissions (r/w/x):\n");

  // 读取读权限
  printf("Read(0/1): ");
  scanf("%d", &per);
  // per & 1 这种写法是利用了位运算的特性来确保结果只能是 0 或 1，其核心作用是取一个整数的最低位二进制值。

  // ===========> 当我们用任何整数 per 与 1 进行 & 运算时：

  //        · 二进制的 1 只有最低位是 1，其他位都是 0
  //        · 运算后，结果的所有高位都会变成 0，只保留原数 per 的最低位

  //   举例：
  //        假设 per 是任意整数：

  //         · 若 per 是偶数（如 4 → 二进制 100）：4 & 1 = 0（最低位是 0）
  //         · 若 per 是奇数（如 5 → 二进制 101）：5 & 1 = 1（最低位是 1）
  //         · 即使 per 是负数（如 -3 → 二进制补码的最低位是 1）：-3 & 1 = 1
  perms.read = per & 1; // 确保只取最低位，保证值是0或1

  // 读取写权限
  printf("Write(0/1): ");
  scanf("%d", &per);
  perms.write = per & 1;

  // 读取执行权限
  printf("Execute(0/1): ");
  scanf("%d", &per);
  perms.execute = per & 1;

  // 检查并输出读权限状态
  if (perms.read == 1)
  {
    printf("Read permission granted.\n");
  }
  else
  {
    printf("Read permission denied.\n");
  }

  // 检查并输出写权限状态
  if (perms.write == 1)
  {
    printf("Write permission granted.\n");
  }
  else
  {
    printf("Write permission denied.\n");
  }

  // 检查并输出执行权限状态
  if (perms.execute == 1)
  {
    printf("Execute permission granted.\n");
  }
  else
  {
    printf("Execute permission denied.\n");
  }

  // 输出权限结构体占用的内存大小，验证位域的作用
  printf("Size of Permissions struct: %zu bytes\n", sizeof(struct Permissions));

  return 0;
}
